// 顶部：仅类型导入
import type { IsNumberParams, IsIntegerParams, IUtilsIs } from './is';
import bignumber from "../../bignumber";

/**
 * 工具 is
 */
class UtilsIs {
    /**
     * 是否是奇数
     * @param data 需要判断的数字
     * @returns 如果是奇数返回 true，否则返回 false
     */
    oddNumber(data: number): boolean {
        return data % 2 !== 0;
    }

    /**
     * 是否是偶数
     * @param data 需要判断的数字
     * @returns 如果是偶数返回 true，否则返回 false
     */
    evenNumber(data: number): boolean {
        return data % 2 === 0;
    }

    /**
     * 是否是数组
     * @param data 需要判断的值
     * @returns 如果是数组返回 true，否则返回 false
     */
    array(data: any): boolean {
        return Array.isArray(data);
    }

    /**
     * 是否是 JSON 对象
     * @param data 需要判断的值
     * @returns 如果是 JSON 对象返回 true，否则返回 false
     */
    json(data: any): boolean {
        return typeof data === 'object' && data !== null && !Array.isArray(data);
    }

    /**
     * 是否是整数
     * @param data 需要判断的值
     * @param params 可选参数，用于配置判断条件
     * @returns 如果是整数返回 true，否则返回 false
     */
    integer(data: any, params?: IsIntegerParams): boolean {
        const isInteger = Number.isInteger(data);
        if (!isInteger) return false;

        if (params) {
            if (params.isCanZero === false && data === 0) return false;
            if (params.isCanNegativeNum === false && data < 0) return false;
        }

        return true;
    }

    /**
     * 是否是数字
     * @param data 需要判断的值
     * @param params 可选参数，用于配置判断条件
     * @returns 如果是数字返回 true，否则返回 false
     */
    number(data: any, params?: IsNumberParams): boolean {
        const isNumber = typeof data === 'number' && !isNaN(data);
        if (!isNumber) return false;

        if (params) {
            if (params.isInteger && !Number.isInteger(data)) return false;
            if (params.isCanZero === false && data === 0) return false;
            if (params.isCanNegativeNum === false && data < 0) return false;
        }

        return true;
    }

    /**
     * 是否是金额
     * @param data 需要判断的值
     * @param params 可选参数，用于配置判断条件
     * @returns 如果是金额返回 true，否则返回 false
     */
    amount(data: any, params?: IsNumberParams): boolean {
        if (typeof data === 'string') data = bignumber.add(data, 0);
        return this.number(data, params);
    }

    /**
     * 判断 string 类型的 value 值是否在第一位
     * @param data 需要判断的字符串
     * @param value 要匹配的值，可以是单个字符串或字符串数组
     * @returns 如果 value 在第一位返回 true，否则返回 false
     */
    firstStr(data: string, value: string | string[]): boolean {
        if (typeof data !== 'string') return false;

        const values = Array.isArray(value) ? value : [value];
        return values.some(v => data.startsWith(v));
    }

    /**
     * 判断 string 类型的 value 值是否在最后一位
     * @param data 需要判断的字符串
     * @param value 要匹配的值，可以是单个字符串或字符串数组
     * @returns 如果 value 在最后一位返回 true，否则返回 false
     */
    lastStr(data: string, value: string | string[]): boolean {
        if (typeof data !== 'string') return false;

        const values = Array.isArray(value) ? value : [value];
        return values.some(v => data.endsWith(v));
    }
}

export default new UtilsIs() as IUtilsIs;
